#include "Thread.hpp"
#include <vector>
#include <memory>

using namespace ThreadModule;
int ticknumber = 10000;

void* ticket(void*){
    while(true){
        if (ticknumber > 0){
            usleep(1000);
            printf("ticknumber is : %d\n", ticknumber--);
        }
        else 
            break; 
    }
    return nullptr;
}   

int main()
{
    pthread_t t1,t2,t3,t4;
    pthread_create(&t1,nullptr,ticket,nullptr);
    pthread_create(&t2,nullptr,ticket,nullptr);
    pthread_create(&t3,nullptr,ticket,nullptr);
    pthread_create(&t4,nullptr,ticket,nullptr);


    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    pthread_join(t3,nullptr);
    pthread_join(t4,nullptr);

    return 0;

}
































// using thread_t = std::shared_ptr<Thread>;

// class ThreadData{
//     public:
//         ThreadData(int max,int start)
//             :_max(max),
//             _start(start)
//         {}
//         ~ThreadData(){}
//         int _max;
//         int _start;
// };

// void func(ThreadData d){
//     for (int i = d._start; i < d._max; i++){
//         printf("i = %d\n",i);
//         sleep(1);
//     }
// }

// // void func(){
// //     while(true){
// //         std::cout << "hello wrold" << std::endl;
// //         sleep(1);
// //     }
// // }

// #define NUM 10
// int main()
// {
//     ThreadData d(60,50);
//     Thread<ThreadData> t(func,d);

//     t.Start();
//     sleep(10);
//     t.Stop();
//     t.Join();
//     return 0;
// }

// int main()
// {
//     std::vector<thread_t> threads;
//     for (int i = 0; i < NUM; i++){
//         threads.emplace_back(std::make_shared<Thread<int>>(func,10));
//     }
//     for (int i = 0; i < NUM;i++){
//         threads[i]->Start();
//     }
//     sleep(5);
//     for (int i = 0; i < NUM; i++){
//         threads[i]->Stop();
//     }
//     sleep(5);

//     for (int i = 0; i < NUM; i++){
//         threads[i]->Join();
//     }    

//     return 0;
// }

// int main()
// {
//     Thread t(func);

//     t.Start();
//     sleep(5);
//     t.Stop();
//     sleep(2);
//     t.Join();
//     return 0;
// }